package stool.sort;

import static stool.sort.resource.ResourceClass.findIntArr;
import static stool.sort.resource.ResourceClass.print;

/**
 * @author Felix YF Dong
 * @Description 归并排序
 * @Date 2022-07-07
 */
public class MergeSort {

    public static void main(String[] args) {
        int[] arr = findIntArr();
        mergeSort(arr, 0, arr.length - 1);
        print(arr);
    }

    /**
     * 分解，排序合并
     */
    public static void mergeSort(int[] arr, int left, int right) {

        if (left >= right) {
            // 相遇，不再分解
            return;
        }

        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }

    public static void merge(int[] arr, int left, int mid, int right) {

        // 第一个归并段的开始
        int s1 = left;
        // 第二个归并段的开始
        int s2 = mid + 1;
        // 临时数组
        int[] tempArr = new int[right - left + 1];
        // tempArr的下标
        int i = 0;

        while (s1 <= mid && s2 <= right) {
            // 两个归并段都有数据
            if (arr[s1] <= arr[s2]) {
                tempArr[i++] = arr[s1++];
            } else {
                tempArr[i++] = arr[s2++];
            }
        }

        while (s1 <= mid) {
            tempArr[i++] = arr[s1++];
        }
        while (s2 <= right) {
            tempArr[i++] = arr[s2++];
        }
        System.arraycopy(tempArr, 0, arr, left, tempArr.length);
//        for (int j = 0; j < tempArr.length; j++) {
//            arr[j + left] = tempArr[j];
//        }
    }
}
